home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 8: LINUX Games
/
Linux Cubed Series 8 - LINUX Games.iso
/
games
/
muds
/
mordor_2.000
/
mordor_2
/
src
/
command10.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-09
|
29KB
|
949 lines
/*
* COMMAND10.C:
*
* Additional user routines.
*
*
*/
#include "mstruct.h"
#include "mextern.h"
/**********************************************************************/
/* sneak */
/**********************************************************************/
int sneak(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
room *rom_ptr, *old_rom_ptr;
creature *crt_ptr;
ctag *cp, *temp;
exit_ *ext_ptr;
long i, t;
int fd, old_rom_num, fall, dmg, n;
int chance;
rom_ptr = ply_ptr->parent_rom;
fd = ply_ptr->fd;
if(ply_ptr->class != ASSASSIN && ply_ptr->class != THIEF && ply_ptr->class < CARETAKER) {
print(fd, "Only thieves & assassins may sneak.\n");
return(0);
}
if(!F_ISSET(ply_ptr, PHIDDN)){
print(fd, "You need to hide first.\n");
return(0);
}
if(cmnd->num < 2) {
print(fd, "Sneak where?\n");
return(0);
}
ext_ptr = find_ext(ply_ptr, rom_ptr->first_ext,
cmnd->str[1], cmnd->val[1]);
if(!ext_ptr) {
print(fd, "I don't see that exit.\n");
return(0);
}
if(F_ISSET(ext_ptr, XLOCKD)) {
print(fd, "It's locked.\n");
return(0);
}
else if(F_ISSET(ext_ptr, XCLOSD)) {
print(fd, "You have to open it first.\n");
return(0);
}
if(F_ISSET(ext_ptr, XFLYSP) && !F_ISSET(ply_ptr, PFLYSP)) {
print(fd, "You must fly to get there.\n");
return(0);
}
if(F_ISSET(ext_ptr, XNAKED) && weight_ply(ply_ptr)) {
print(fd, "You cannot bring anything through that exit.\n");
return(0);
}
if(F_ISSET(ext_ptr, XPLDGK))
if (!F_ISSET(ply_ptr, PPLDGK)){
print(fd, "You do not have the proper authorization to go there.\n");
return(0);
}
else if (BOOL(F_ISSET(ext_ptr,XKNGDM)) != BOOL(F_ISSET(ply_ptr, PKNGDM))){
print(fd, "You belong to the wrong organization to go there.\n");
return(0);
}
t = Time%24L;
if(F_ISSET(ext_ptr, XNGHTO) && (t>6 && t < 20)) {
print(fd, "That exit is not open during the day.\n");
return(0);
}
if(F_ISSET(ext_ptr, XDAYON) && (t<6 || t > 20)) {
print(fd, "That exit is closed for the night.\n");
return(0);
}
if(F_ISSET(ext_ptr,XPGUAR)){
cp = rom_ptr->first_mon;
while(cp) {
if(F_ISSET(cp->crt, MPGUAR)) {
if(!F_ISSET(ply_ptr, PINVIS) && ply_ptr->class < CARETAKER){
print(fd, "%M blocks your exit.\n", cp->crt);
return(0);
}
if(F_ISSET(cp->crt, MDINVI) && ply_ptr->class < CARETAKER) {
print(fd, "%M blocks your exit.\n", cp->crt);
return(0);
}
}
cp = cp->next_tag;
}
}
if(F_ISSET(ext_ptr, XFEMAL) && F_ISSET(ply_ptr, PMALES)){
print(fd, "Sorry, only females are allowed to go there.\n");
return(0);
}
if(F_ISSET(ext_ptr, XMALES) && !F_ISSET(ply_ptr, PMALES)){
print(fd, "Sorry, only males are allowed to go there.\n");
return(0);
}
if((F_ISSET(ext_ptr, XCLIMB) || F_ISSET(ext_ptr, XREPEL)) &&
!F_ISSET(ply_ptr, PLEVIT)) {
fall = (F_ISSET(ext_ptr, XDCLIM) ? 50:0) + 50 -
fall_ply(ply_ptr);
if(mrand(1,100) < fall) {
dmg = mrand(5, 15+fall/10);
if(ply_ptr->hpcur <= dmg){
print(fd, "You fell to your death.\n");
ply_ptr->hpcur=0;
broadcast_rom(fd, ply_ptr->rom_num, "%M died from the fall.\n");
die(ply_ptr, ply_ptr);
return(0);
}
ply_ptr->hpcur -= dmg;
print(fd, "You fell and hurt yourself for %d damage.\n",
dmg);
broadcast_rom(fd, ply_ptr->rom_num, "%M fell down.",
ply_ptr);
if(ply_ptr->hpcur < 1) {
print(fd, "You died.\n");
die(ply_ptr, ply_ptr);
}
if(F_ISSET(ext_ptr, XCLIMB))
return(0);
}
}
i = LT(ply_ptr, LT_ATTCK);
t = time(0);
if(t < i) {
please_wait(fd, i-t);
return(0);
}
chance = MIN(85, 5 + 6*ply_ptr->level +
3*bonus[ply_ptr->dexterity]);
if(F_ISSET(ply_ptr, PBLIND))
chance = MIN(20, chance);
if(mrand(1,100) > chance)
{
print(fd,"You failed to sneak.\n");
F_CLR(ply_ptr, PHIDDN);
cp = rom_ptr->first_mon;
while(cp) {
if(F_ISSET(cp->crt, MBLOCK) &&
is_enm_crt(ply_ptr->name, cp->crt) &&
!F_ISSET(ply_ptr, PINVIS) && ply_ptr->class < CARETAKER) {
print(fd, "%M blocks your exit.\n", cp->crt);
return(0);
}
cp = cp->next_tag;
}
}
if(!F_ISSET(rom_ptr, RPTRAK))
strcpy(rom_ptr->track, ext_ptr->name);
old_rom_num = rom_ptr->rom_num;
old_rom_ptr = rom_ptr;
load_rom(ext_ptr->room, &rom_ptr);
if(rom_ptr == old_rom_ptr) {
print(fd, "Off map in that direction.\n");
return(0);
}
n = count_vis_ply(rom_ptr);
if(rom_ptr->lolevel > ply_ptr->level && ply_ptr->class < CARETAKER) {
print(fd, "You must be at least level %d to go that way.\n",
rom_ptr->lolevel);
return(0);
}
else if(ply_ptr->level > rom_ptr->hilevel && rom_ptr->hilevel &&
ply_ptr->class < CARETAKER) {
print(fd, "Only players under level %d may go that way.\n",
rom_ptr->hilevel+1);
return(0);
}
else if((F_ISSET(rom_ptr, RONEPL) && n > 0) ||
(F_ISSET(rom_ptr, RTWOPL) && n > 1) ||
(F_ISSET(rom_ptr, RTHREE) && n > 2)) {
print(fd, "That room is full.\n");
return(0);
}
if(!F_ISSET(ply_ptr, PHIDDN))
if(strcmp(ext_ptr->name, "up") && strcmp(ext_ptr->name, "down")
&& strcmp(ext_ptr->name, "out") && !F_ISSET(ply_ptr, PDMINV)) {
broadcast_rom(fd, old_rom_ptr->rom_num, "%M went to the %s.",
ply_ptr, ext_ptr->name);
}
else if(!F_ISSET(ply_ptr, PDMINV)) {
broadcast_rom(fd, old_rom_ptr->rom_num, "%M went %s.",
ply_ptr, ext_ptr->name);
}
del_ply_rom(ply_ptr, ply_ptr->parent_rom);
add_ply_rom(ply_ptr, rom_ptr);
check_traps(ply_ptr, rom_ptr);
return(0);
}
/**********************************************************************/
/* Group_talk */
/**********************************************************************/
/* Group talk allows a player to broadcast a message to everyone in *
* their group. gtalk first checks to see if the player is following *
* another player; in that case, the group talk message will be sent *
* every member in the leader's group. If the player isn't following *
* then it is assumed the player is a leader and the message will be *
* sent to all the followers in the group. */
int gtalk(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
creature *leader;
ctag *cp;
int found=0, i, fd;
int len;
fd = ply_ptr->fd;
if(ply_ptr->following)
{
leader = ply_ptr->following;
cp = ply_ptr->following->first_fol;
}
else
{
leader = ply_ptr;
cp = ply_ptr->first_fol;
}
if(!cp) {
print(fd, "You are not in a group.\n");
return(0);
}
len = strlen(cmnd->fullstr);
for(i=0; i< len && i < 256; i++) {
if(cmnd->fullstr[i] == ' ' && cmnd->fullstr[i+1] != ' ')
found++;
if(found==1) break;
}
cmnd->fullstr[255] = 0;
if(found < 1 || strlen(&cmnd->fullstr[i+1]) < 1) {
print(fd, "Group mention what?\n");
return(0);
}
if(F_ISSET(ply_ptr, PSILNC)) {
print(fd, "You can't seem to form the words.\n");
return(0);
}
found = 0; /*if only inv dm in group */
while(cp) {
if((F_ISSET(cp->crt, PIGNOR) && (ply_ptr->class < CARETAKER)) &&
!F_ISSET(cp->crt,PDMINV))
print(fd, "%s is ignoring everyone.\n", cp->crt->name);
else
print(cp->crt->fd, "### %M group mentioned, \"%s\".\n",
ply_ptr, &cmnd->fullstr[i+1]);
if (!F_ISSET(cp->crt,PDMINV))
found = 1;
cp = cp->next_tag;
}
if(!found)
{
print(fd, "You are not in a group.\n");
return(0);
}
if((F_ISSET(leader, PIGNOR) && (ply_ptr->class < CARETAKER)) &&
!F_ISSET(leader,PDMINV))
print(fd, "%s is ignoring everyone.\n", leader->name);
else
print(leader->fd, "### %M group mentioned, \"%s\".\n",
ply_ptr, &cmnd->fullstr[i+1]);
if (found)
broadcast_eaves("--- %s group talked: \"%s\".", ply_ptr->name,
&cmnd->fullstr[i+1]);
return(0);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* lower_prof */
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void lower_prof(ply_ptr, exp)
/* The lower_prof function adjusts a player's magical realm and weapon *
* proficiency after a player loses (exp) amount of experience */
creature *ply_ptr;
long exp;
{
long profloss, total;
int n, below=0;
for(n=0,total=0L; n<5; n++)
total += ply_ptr->proficiency[n];
for(n=0; n<4; n++)
total += ply_ptr->realm[n];
profloss = MIN(exp,total);
while(profloss > 9L && below < 9) {
below = 0;
for(n=0; n<9; n++) {
if(n < 5) {
ply_ptr->proficiency[n] -=
profloss/(9-n);
profloss -= profloss/(9-n);
if(ply_ptr->proficiency[n] < 0L) {
below++;
profloss -=
ply_ptr->proficiency[n];
ply_ptr->proficiency[n] = 0L;
}
}
else {
ply_ptr->realm[n-5] -= profloss/(9-n);
profloss -= profloss/(9-n);
if(ply_ptr->realm[n-5] < 0L) {
below++;
profloss -=
ply_ptr->realm[n-5];
ply_ptr->realm[n-5] = 0L;
}
}
}
}
for(n=1,total=0; n<5; n++)
if(ply_ptr->proficiency[n] >
ply_ptr->proficiency[total]) total = n;
if(ply_ptr->proficiency[total] < 1024L)
ply_ptr->proficiency[total] = 1024L;
return;
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* add_prof */
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void add_prof(ply_ptr, exp)
/* The add_prof function adjusts a player's magical realm and weapon *
* proficiency after the player gains an unassigned amount of experience *
* such as from a quest item or pkilling. The exp gain is divided *
* between the player's 5 weapon proficiency and 4 magic realms. */
creature *ply_ptr;
long exp;
{
int n;
if (exp)
exp = exp/9L;
else return;
for(n=0; n<9; n++)
if(n < 5)
ply_ptr->proficiency[n] += exp;
else
ply_ptr->realm[n-5] += exp;
return;
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* Pledge */
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* The pledge command allows a player to pledge allegiance to a given *
* monster. A pledge players allows the player to use selected items, *
* and exits, as well a being able to kill players of the opposing *
* kingdoms for experience (regardless if one player is lawful.) In *
* order for a player to pledge, the player needs to be in the correct *
* room with a correct monster to pledge to. */
int pledge(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
object *obj_ptr;
creature *crt_ptr;
room *rom_ptr;
int fd, amte, amtg;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
amte = REWARD;
amtg = REWARD *5;
if(cmnd->num < 2) {
print(fd, "Join whom's organization?\n");
return(0);
}
if(F_ISSET(ply_ptr,PPLDGK)){
print(fd, "You have already joined.\n");
return(0);
}
if(!F_ISSET(rom_ptr,RPLDGK)){
print(fd, "You can not join here. \n");
return(0);
}
crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon,
cmnd->str[1], cmnd->val[1]);
if(!crt_ptr) {
print(fd, "I don't see that here.\n");
return(0);
}
if (!F_ISSET(crt_ptr,MPLDGK))
{
print(fd, "You can not join %m's organization.\n",crt_ptr);
return(0);
}
broadcast_rom(fd, ply_ptr->rom_num, "%M pledges %s allegiance to %m.\n",
ply_ptr,F_ISSET(crt_ptr, PMALES) ? "his":"her", crt_ptr);
print(fd, "You kneel before %m as you join the organization.\n",crt_ptr);
/* print(fd, "%M draws %s sword and dubs you a member of %s organization.\n", */
/* crt_ptr,*/
/* F_ISSET(crt_ptr, PMALES) ? "his":"her",*/
/* F_ISSET(crt_ptr, PMALES) ? "his":"her");*/
print(fd,"The room erupts in cheers for the newest member of %m's organization.\n",crt_ptr);
print(fd, "You gain %d experience and %d gold!\n",REWARD, REWARD*5);
ply_ptr->experience += amte;
add_prof(ply_ptr,amte);
ply_ptr->gold += amtg;
ply_ptr->hpcur = ply_ptr->hpmax;
ply_ptr->mpcur = ply_ptr->mpmax;
F_CLR(ply_ptr, PHIDDN);
F_SET(ply_ptr,PPLDGK);
if(F_ISSET(crt_ptr,MKNGDM))
F_SET(ply_ptr,PKNGDM);
return(0);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* rescind */
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* The rescind command allows a player to rescind allegiance to a given *
* monster. Once a player has rescinded his allegiance, he or she will *
* lose all the privilliages of rescinded kingdom as well as a *
* specified amount of experience and gold. */
int rescind(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
object *obj_ptr;
creature *crt_ptr;
room *rom_ptr;
int fd, amte, amtg;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
amte = REWARD*10;
amtg = REWARD*20;
if(cmnd->num < 2) {
print(fd, "Rescind to whom?\n");
return(0);
}
if(!F_ISSET(ply_ptr,PPLDGK)){
print(fd, "You have not joined an organization.\n");
return(0);
}
if(!F_ISSET(rom_ptr,RRSCND)){
print(fd, "You can not rescind your allegiance here.\n");
return(0);
}
crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon,
cmnd->str[1], cmnd->val[1]);
if(!crt_ptr) {
print(fd, "I don't see that here.\n");
return(0);
}
if(BOOL(F_ISSET(crt_ptr,MKNGDM)) != BOOL(F_ISSET(ply_ptr,PKNGDM))){
print(fd, "You are in the wrong organization to rescind!\n");
return(0);
}
if (ply_ptr->gold < amtg){
print(fd, "You do not have sufficient gold to rescind.\n");
return (0);
}
if (!F_ISSET(crt_ptr,MRSCND))
{
print(fd, "You can not rescind your allegiance to %m.\n",crt_ptr);
return(0);
}
broadcast_rom(fd, ply_ptr->rom_num, "%M rescinds %s allegiance to %m.\n",
ply_ptr,F_ISSET(crt_ptr, PMALES) ? "his":"her", crt_ptr);
print(fd, "%M scourns you as you are stripped of all your rights and privileges!\n", crt_ptr);
print(fd, "\nThe room fills with boos and hisses as you are ostracized from %m's organization.\n",
crt_ptr);
amte = MIN(amte,ply_ptr->experience);
print(fd, "\nYou lose %d experience and %d gold!\n",amte,amtg);
lower_prof(ply_ptr,amte);
ply_ptr->experience -= amte;
ply_ptr->gold -= amtg;
ply_ptr->hpcur = ply_ptr->hpmax/3;
ply_ptr->mpcur = 0;
F_CLR(ply_ptr, PHIDDN);
F_CLR(ply_ptr,PPLDGK);
F_CLR(ply_ptr,PKNGDM);
return(0);
}
/*====================================================================*/
/* lose_all */
/*====================================================================*/
/* lose_all causes the given player to lose all his or her possessions *
* including any equipted items. */
void lose_all(ply_ptr)
creature *ply_ptr;
{
object *obj_ptr;
room *rom_ptr;
otag *op;
int fd, i;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
/* remove all equipted items */
for(i=0; i<MAXWEAR; i++) {
if(ply_ptr->ready[i] && !F_ISSET(ply_ptr->ready[i], OCURSE)) {
F_CLR(ply_ptr->ready[i], OWEARS);
add_obj_crt(ply_ptr->ready[i], ply_ptr);
ply_ptr->ready[i] = 0;
}
}
compute_ac(ply_ptr);
compute_thaco(ply_ptr);
/* remove and delete all possessions */
op = ply_ptr->first_obj;
while(op) {
obj_ptr = op->obj;
op = op->next_tag;
del_obj_crt(obj_ptr, ply_ptr);
free_obj(obj_ptr);
}
}
/**********************************************************************/
/* dissolve_item */
/**********************************************************************/
/* dissolve_item will randomly select one equipted (including held or *
* wield) items on the given player and then delete it. The player *
* receives a message that the item was destroyed as well as who is *
* responsible for the deed. */
void dissolve_item (ply_ptr,crt_ptr)
creature *ply_ptr;
creature *crt_ptr;
{
int n;
char checklist[MAXWEAR];
int numwear=0, i;
for(i=0; i<MAXWEAR; i++) {
checklist[i] = 0;
/* if(i==WIELD-1 || i==HELD-1) continue; */
if(ply_ptr->ready[i])
checklist[numwear++] = i+1;
}
if(!numwear)
n = 0;
else {
i = mrand(0, numwear-1);
n = (int) checklist[i];
}
if(n) {
broadcast_rom(ply_ptr->fd,ply_ptr->rom_num,"%M destroys %m's %s.",
crt_ptr, ply_ptr, ply_ptr->ready[n-1]->name);
print(ply_ptr->fd,"%M destroys your %s.\n",crt_ptr,
ply_ptr->ready[n-1]->name);
free_obj(ply_ptr->ready[n-1]);
ply_ptr->ready[n-1] = 0;
compute_ac(ply_ptr);
}
return;
}
/**********************************************************************/
/* purchase */
/**********************************************************************/
/* purchase allows a playe rto buy an item from a monster. The *
* purchase item flag must be set, and the monster must have an *
* object to sell. The object for sale is determined by the first *
* object listed in carried items. */
int purchase(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
creature *crt_ptr;
room *rom_ptr;
object *obj_ptr, *obj_list[10];
int maxitem = 0,obj_num[10];
long amt;
int fd, i, j, found = 0, match = 0;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
if(cmnd->num < 2) {
print(fd, "Purchase what?\n");
return(0);
}
if(cmnd->num < 3 ) {
print(fd, "Syntax: purchase <item> <monster>\n");
return(0);
}
crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon, cmnd->str[2],
cmnd->val[2]);
if(!crt_ptr) {
print(fd, "That is not here.\n");
return(0);
}
if (!F_ISSET(crt_ptr,MPURIT)){
print(fd, "You can not purchase objects from %m.\n",crt_ptr);
return(0);
}
for (i=0;i < 10; i++)
if (crt_ptr->carry[i] > 0){
found = 0;
for(j=0; j< maxitem; j++)
if (crt_ptr->carry[i] == obj_num[j])
found = 1;
if (!found){
maxitem++;
obj_num[i] = crt_ptr->carry[i];
}
}
if (!maxitem){
print(fd, "%M has nothing to sell.\n",crt_ptr);
return(0);
}
found = 0;
for(i=0;i< maxitem; i++){
if (!(load_obj(crt_ptr->carry[i], &obj_ptr) < 0))
if(EQUAL(obj_ptr, cmnd->str[1]) && (F_ISSET(ply_ptr, PDINVI) ?
1:!F_ISSET(obj_ptr, OINVIS))) {
match++;
if(match == cmnd->val[1]) {
found = 1;
break;
}
}
}
if(!found){
print(fd, "%M says, \"Sorry, I don't have any of those to sell.\"\n", crt_ptr);
return(0);
}
amt = MAX(10,obj_ptr->value*1);
if(ply_ptr->gold < amt){
print(fd,
"%M says \"The price is $%d, and not a gold piece less!\"\n",crt_ptr,amt);
}
else {
print(fd, "You pay %m %d gold pieces.\n",crt_ptr,amt);
print(fd, "%M says, \"Thank you very much. Here is your %s.\"\n",crt_ptr,obj_ptr->name);
broadcast_rom(fd, ply_ptr->rom_num, "%M pays %m $%d for %i.\n", ply_ptr, crt_ptr, amt, obj_ptr);
ply_ptr->gold -= amt;
add_obj_crt(obj_ptr, ply_ptr);
}
return(0);
}
/**********************************************************************/
/* selection */
/**********************************************************************/
/* The selection command lists all the items a monster is selling. *
* The monster needs the MPURIT flag set to denote it can sell. */
int selection(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
creature *crt_ptr;
room *rom_ptr;
object *obj_ptr[10];
int obj_list[10];
int fd, i, j, found = 0, maxitem = 0;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
if(cmnd->num < 2) {
print(fd, "Ask who for a selection?\n");
return(0);
}
crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon, cmnd->str[1],
cmnd->val[1]);
if(!crt_ptr) {
print(fd, "That is not here.\n");
return(0);
}
if(!F_ISSET(crt_ptr,MPURIT)){
print(fd, "%M is not selling anything.\n",crt_ptr);
return(0);
}
for (i=0;i < 10; i++)
if (crt_ptr->carry[i] > 0){
found = 0;
for(j=0; j< maxitem; j++)
if (crt_ptr->carry[i] == obj_list[j])
found = 1;
if (!found){
maxitem++;
obj_list[i] = crt_ptr->carry[i];
}
}
if(!maxitem){
print(fd, "%M has nothing to sell.\n",crt_ptr);
return(0);
}
print(fd, "%M is currently selling:\n",crt_ptr);
for (i=0;i<maxitem;i++)
if ((load_obj(crt_ptr->carry[i], &(obj_ptr[i])) < 0) ||
(crt_ptr->carry[i] == 0))
print(fd,"%d) Out of stock.\n",i+1);
else
print(fd,"%d) %-22s %ldgp\n",i+1,
(obj_ptr[i])->name,MAX(10,((obj_ptr[i])->value)));
print(fd,"\n");
return(0);
}
/**********************************************************************/
/* trade */
/**********************************************************************/
int trade(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
creature *crt_ptr;
room *rom_ptr;
object *obj_ptr, *trd_ptr;
int obj_list[5][2];
int fd, i, j, found = 0, maxitem = 0;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
if(cmnd->num < 2) {
print(fd, "Trade what?\n");
return(0);
}
if(cmnd->num < 3) {
print(fd, "Syntax: trade <item> <monster>\n");
return(0);
}
crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon, cmnd->str[2],
cmnd->val[2]);
if(!crt_ptr) {
print(fd, "That is not here.\n");
return(0);
}
if(!F_ISSET(crt_ptr,MTRADE)){
print(fd, "You can't trade with %m.\n",crt_ptr);
return(0);
}
obj_ptr = find_obj(ply_ptr, ply_ptr->first_obj,
cmnd->str[1], cmnd->val[1]);
if(!obj_ptr) {
print(fd, "You don't have that.\n");
return(0);
}
for (i=0;i < 5; i++)
if (crt_ptr->carry[i] > 0){
found = 0;
for(j=0; j< maxitem; j++)
if (crt_ptr->carry[i] == obj_list[j][0])
found = 1;
if (!found){
maxitem++;
obj_list[i][0] = crt_ptr->carry[i];
obj_list[i][1] = crt_ptr->carry[i+5];
}
}
if(!maxitem){
print(fd, "%M has nothing to trade.\n",crt_ptr);
return(0);
}
found = 0;
for(i=0;i < maxitem; i++){
if (load_obj(obj_list[i][0], &trd_ptr) < 0)
continue;
if (!strcmp(obj_ptr->name, trd_ptr->name)){
found = i+1;
break;
}
}
if(!found || ((obj_ptr->shotscur <= obj_ptr->shotsmax/10)&&(obj_ptr->type != MISC)))
print(fd,"%M says, \"I don't want that!\"\n",crt_ptr);
else{
if (crt_ptr->carry[found+4] == 0){
del_obj_crt(obj_ptr, ply_ptr);
add_obj_crt(obj_ptr, crt_ptr);
print(fd, "%M says, \"Thanks!, I really needed %i.\n",
crt_ptr,obj_ptr);
print(fd, "Sorry I don't have anything for you.\"\n");
broadcast_rom(fd, ply_ptr->rom_num,"%M gives %m %i.\n",
ply_ptr,crt_ptr,obj_ptr);
}
else if(!(load_obj((obj_list[found-1][1]), &trd_ptr) < 0)){
if(trd_ptr->questnum && Q_ISSET(ply_ptr, trd_ptr->questnum-1)) {
print(fd, "You have already fulfilled that quest.\n");
return(0);
}
del_obj_crt(obj_ptr, ply_ptr);
add_obj_crt(obj_ptr, crt_ptr);
add_obj_crt(trd_ptr, ply_ptr);
print(fd,"%M says, \"Thank you for retrieving %i for me.\n",
crt_ptr,obj_ptr);
print(fd,"For your deed I will give you %i.\"\n",trd_ptr);
print(fd,"%M gives you %i.\n",crt_ptr,trd_ptr);
broadcast_rom(fd, ply_ptr->rom_num,"%M gives %m %i.\n",
ply_ptr,crt_ptr,obj_ptr);
/* broadcast_rom(fd, ply_ptr->rom_num,"%M gives %m %i.\n", */
/* ply_ptr,crt_ptr,obj_ptr); */
/* if return object is a quest item */
if(trd_ptr->questnum) {
print(fd, "Quest fulfilled! Don't drop it.\n");
print(fd, "You won't be able to pick it up again.\n");
Q_SET(ply_ptr, trd_ptr->questnum-1);
ply_ptr->experience += quest_exp[trd_ptr->questnum-1];
print(fd, "%ld experience granted.\n",
quest_exp[trd_ptr->questnum-1]);
add_prof(ply_ptr,quest_exp[trd_ptr->questnum-1]);
}
}
}
return(0);
}
int room_obj_count(first_obj)
otag *first_obj;
{
long num = 0;
while (first_obj)
{
num++;
first_obj = first_obj->next_tag;
}
return (num);
}